package com.blog.cmrpersonalblog.service;

import com.blog.cmrpersonalblog.dto.comment.responst.CommentImageInfo;
import com.blog.cmrpersonalblog.dto.comment.responst.CommentImageUploadResponse;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 评论图片服务接口
 */
public interface CommentImageService {

    /**
     * 上传评论图片到临时存储
     * @param file 上传的文件
     * @param userId 用户ID
     * @param uploadToken 上传令牌（可选）
     * @return 上传结果
     */
    CommentImageUploadResponse uploadCommentImage(MultipartFile file, Long userId, String uploadToken);

    /**
     * 将临时图片关联到评论
     * @param commentId 评论ID
     * @param tempImageIds 临时图片ID列表
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean attachImagesToComment(Long commentId, List<Long> tempImageIds, Long userId);

    /**
     * 根据上传令牌将临时图片关联到评论
     * @param commentId 评论ID
     * @param uploadTokens 上传令牌列表
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean attachImagesByTokens(Long commentId, List<String> uploadTokens, Long userId);

    /**
     * 获取评论的图片列表
     * @param commentId 评论ID
     * @return 图片信息列表
     */
    List<CommentImageInfo> getCommentImages(Long commentId);

    /**
     * 批量获取多个评论的图片列表（性能优化）
     * @param commentIds 评论ID列表
     * @return 评论ID到图片列表的映射
     */
    Map<Long, List<CommentImageInfo>> getBatchCommentImages(List<Long> commentIds);

    /**
     * 删除评论图片
     * @param imageId 图片ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteCommentImage(Long imageId, Long userId);

    /**
     * 删除评论的所有图片
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteAllCommentImages(Long commentId, Long userId);

    /**
     * 更新评论的所有图片状态
     * @param commentId 评论ID
     * @param status 状态 0-已删除 1-正常
     * @return 更新是否成功
     */
    boolean updateCommentImagesStatus(Long commentId, Integer status);

    /**
     * 批量更新多个评论的图片状态（用于删除评论树）
     * @param commentIds 评论ID列表
     * @param status 状态 0-已删除 1-正常
     * @return 更新是否成功
     */
    boolean updateCommentsImagesStatus(List<Long> commentIds, Integer status);

    /**
     * 清理过期的临时图片
     * @return 清理的图片数量
     */
    int cleanExpiredTempImages();

    /**
     * 生成上传令牌
     * @param userId 用户ID
     * @return 上传令牌
     */
    String generateUploadToken(Long userId);

    /**
     * 验证文件是否为有效的评论图片
     * @param file 上传的文件
     * @return 是否有效
     */
    boolean isValidCommentImage(MultipartFile file);

    /**
     * 生成评论图片文件名
     * @param originalFileName 原始文件名
     * @param userId 用户ID
     * @return 新文件名
     */
    String generateCommentImageFileName(String originalFileName, Long userId);

    /**
     * 获取用户的临时图片列表
     * @param userId 用户ID
     * @param uploadToken 上传令牌（可选）
     * @return 临时图片列表
     */
    List<CommentImageInfo> getUserTempImages(Long userId, String uploadToken);
}
